#include "coroutine.h"
#include <stdio.h>

/*
可以先使用coroutine_open打开一个计划，然后在该计划中创建协程。
你应该在调用coroutine_open的线程中调用coroutine_resume，你不能在同一个时间表中的一个协程中调用它。
同一个调度中的协程共享堆栈，因此您可以创建许多协程而不用担心内存问题。
但是切换上下文将复制协程使用的堆栈
*/

struct args {
	int n;
};

static void
foo(struct schedule * S, void *ud) {
	struct args * arg = ud;
	int start = arg->n;
	int i;
	for (i = 0; i < 5; i++) {
		printf("coroutine %d : %d\n",coroutine_running(S) , start + i);
		coroutine_yield(S);
	}
}

static void
test(struct schedule *S) {
	struct args arg1 = { 0 };
	struct args arg2 = { 100 };

	int co1 = coroutine_new(S, foo, &arg1);
	int co2 = coroutine_new(S, foo, &arg2);
	printf("main start\n");

	//循环，当协程中有dead的协程，结束唤醒，直接结束
	while (coroutine_status(S,co1) && coroutine_status(S,co2)) {
		coroutine_resume(S,co1);
		coroutine_resume(S,co2);
	}
	printf("main end\n");
}

int
main() {
	struct schedule * S = coroutine_open();
	test(S);
	coroutine_close(S);
	return 0;
}

